エキスパートのように IAM 権限を洗練させる Refining IAM permissions like an expert #SEC203 #AWSreInvent
コンバンハ、千葉(幸)です。
突然ですが、わたしの好きな AWS サービスは AWS IAM です。一番好きです。
そんなわたしが AWS re:Invent 2023 で受講するセッションを吟味している際に、とても気になるタイトルのワークショップを見つけました。
- SEC203-R | Refining IAM permissions like an expert [REPEAT]
「エキスパートのように IAM 権限を洗練させる」?これは気になるタイトルですね。ということで迷わず聴講してきました。(3ヶ月前に。)このブログではそのレポートをまとめます。
ワークショップの概要
セッションカタログから引用した概要文はこちら。
In this workshop, learn how to use AWS services to automatically detect unused and business-critical IAM permissions and ways you can update them safely to move toward a least-privilege environment. Discover how to embed the automation into the software development lifecycle to improve the builder experience while also accelerating security objectives. You must bring your laptop to participate. (機械翻訳) このワークショップでは、AWSサービスを使用して、未使用のビジネスクリティカルなIAM権限を自動的に検出する方法と、最小権限環境に移行するために安全に更新する方法を学びます。自動化をソフトウェア開発ライフサイクルに組み込み、セキュリティ目標を加速させながら、ビルダーエクスペリエンスを向上させる方法を発見してください。参加にはノートパソコンが必要です。
このワークショップは現在一般公開されているので、こちらから試せます。(AWS アカウントが必要です。)
ワークッショップで使用されたPDFは以下です。(見なくても大丈夫です。)
ワークッショップで学べること
IAM Access Analyzer の以下の機能について学ぶのがメインです。最低限ここを押さえられるとよいでしょう。
機能 | 代表的なアクション | 概要 |
---|---|---|
ポリシーの検証 | ValidatePolicy | JSONポリシーの構文やベストプラクティスに則っているかを検証 |
カスタムポリシーチェック | CheckAccessNotGranted | 特定のアクションがJSONポリシー内で許可されていないかをチェック |
未使用のアイデンティティの検出 | GetFindingV2 | 一定期間使用されていないIAMロールやパーミッションを検出 |
これらのアクションを Lambda や CodeBuild、Event Bridge と組み合わせたシナリオも学べます。全体のアーキテクチャ図のイメージは以下です。
(https://github.com/aws-samples/aws-iam-refining-policy-permissionsより引用)
ワークショップの流れ
大きく以下の 3つに分けられます。
- AWS CLI でのコマンドの実行
- シナリオ1. 中央セキュリティチーム
- シナリオ2. DevOps エンジニア
2,3 は以下のレポジトリから関連リソースをデプロイする必要があります。
Deployment using AWS CDK v2
- Clone this repository
- Install AWS CLI v2
- Install Python 3.11
- Install AWS CDK
- Install Docker Desktop
- Use your IDE of preference such as
PyCharm
,Visual Studio Code
,Sublime
,vim
,Atom
- Local configuration steps:
- Go to the root directory of the cloned repo
- Run
npm i
to install required libraries- Create a virtual environment for Python
python -m venv .venv
, you can use other virtual environment tools- Activate the virtual environment:
source .venv/bin/activate
for MacOS and Linux.venv\scripts\activate
for Windows- Run
pip install -r requirements
to install required libraries- Configure the AWS CLI to use your AWS account's
Administrator
credentials- Test AWS credentials using
aws sts get-caller-identity
- Prepare the account for deployment running
npx cdk bootstrap
- Check synthesis
npx cdk synth
- If no errors were detected, deploy all Stacks
npx cdk deploy --all
環境の準備が大変、という方は 1. の AWS CLI コマンドの実行だけでも体験しておくのがオススメです。(とはいえ、1. でも一部はリソースの構築などが必要です。)
1. AWS CLI コマンドの実行
3 つの機能を AWS CLI で実行し、挙動を確認します。
ポリシーの検証
以下の AWS CLI コマンドを使用し、引数として渡した JSON ポリシーの検証を行います。
このコマンドで検証してくれる内容は以下のエントリで取り上げられているものです。マネジメントコンソールでポリシーの編集を行ったことがある方はイメージがつきやすいでしょう。
なお、このアクションに対応したポリシーは以下です。
- アイデンティティベースポリシー
- リソースベースポリシー
- サービスコントロールポリシー
カスタムポリシーチェック
IAM Access Analyzer ではカスタムポリシーチェックという機能が用意されています。2023年11月末に追加された機能です。
カスタムポリシーチェックには以下の2種類があります。
- ポリシー編集時に新しいアクセス権限が付与されないかをチェック(CheckNoNewAccess )
- 特定の IAM アクションのリストに合致するものがないかのチェック(CheckAccessNotGranted)
このワークショップでは、後者に対する機能検証を check-access-not-granted コマンドを用いて行います。
このコマンドに対応したポリシーは以下です。
- アイデンティティベースポリシー
- リソースベースポリシー
未使用の IAM の検出
IAM Access Analyzer では、未使用のアクションや IAM ロールを検出する機能があります。これも2023年11月末に追加されたものです。
ここまで見てきたアクションとは異なり、今回の機能にはアナライザーと呼ばれるリソースの作成を必要とします。従来アナライザーが検出可能であったのは「外部からアクセス可能な状態になっているリソースベースポリシー」でしたが、機能追加によって「未使用の IAM」も検出できるようになりました。
それに伴い、関連コマンドが V2 が付与されたものに変わっています。
- list-findings-v2 — AWS CLI 2.15.23 Command Reference
- get-finding-v2 — AWS CLI 2.15.23 Command Reference
2. シナリオ1. 中央セキュリティチーム
このシナリオのイメージは以下です。
(ワークショップのページより引用)
大きく以下を実装します。
- ポリシーの検証とカスタムポリシーチェックを組み込んだ Code Pipeline
- イベントに応じて発火する3 種の Lambda 関数と、それに基づいた評価および Amazon SNS によるメール通知
イメージ図では CodeBuild と Lambda 関数が関連しているように見えますが、実際には関連しません。「CodeBuild にValidate policy
とCustom policy checks
の機能を盛り込んでいる」ということを表現している図かと思います。
CodeBuild では以下の buildspec ファイルを用いています。先ほど学んだ AWS CLI コマンドが組み込まれていることがわかります。
{ "version": "0.1", "phases": { "install": { "commands": [ "curl https://awscli.amazonaws.com/awscli-exe-linux-x86_64.zip -o awscliv2.zip", "unzip awscliv2.zip", "sudo ./aws/install --bin-dir /usr/local/bin --install-dir /usr/local/aws-cli --update", "export PATH=/usr/local/bin:$PATH", "npm i", "npm install -g aws-cdk", "npx cdk version", "python -m venv .venv", ". .venv/bin/activate", "python --version", "pip install -r requirements.txt", "pip install boto3==1.33.0", "pip install cfn-policy-validator==0.0.25", "pip list" ] }, "build": { "commands": [ "npx cdk synth > ./iac.yaml", "cfn-policy-validator parse --template-path ./iac.yaml --region ${AWS_REGION} > iac_iam_parsed.json", "cat iac_iam_parsed.json | jq -r '.Roles[].Policies[].Policy' > policy.json", "echo 'call access analyzer to validate policy'", "aws accessanalyzer validate-policy --policy-type IDENTITY_POLICY --policy-document file://policy.json", "echo 'call custom policy checks'", "aws accessanalyzer check-access-not-granted --policy-type='IDENTITY_POLICY' --policy-document file://policy.json --access='{\"actions\":[\"s3:PutBucketPolicy\"]}'" ] } } }
Lambda 関数によって行われる SNS メール通知のイメージは以下です。ここでは新たなポリシーバージョンが作成されたことをトリガーに Event Bridge → Lambda 関数→ Amason SNS と呼び出され、最終的にメール通知が行われます。
3. シナリオ2. DevOps エンジニア
このシナリオのイメージは以下です。
IAC を Git push したことをきっかけに Code Pipeline が走り、「ポリシーの検証」「カスタムポリシーチェック」が一連の処理の中で行われることを確認するシナリオです。
Code Pipeline の実行ログを確認すると、以下のようにビルドコマンドの中でアクションが実行されていることが確認できます。
... [Container] 2023/11/29 00:00:38.160508 Running command echo 'call access analyzer to validate policy' call access analyzer to validate policy [Container] 2023/11/29 00:00:38.164831 Running command aws accessanalyzer validate-policy --policy-type IDENTITY_POLICY --policy-document file://policy.json { "findings": [] } [Container] 2023/11/29 00:00:38.810299 Running command echo 'call custom policy checks' call custom policy checks [Container] 2023/11/29 00:00:38.814582 Running command aws accessanalyzer check-access-not-granted --policy-type='IDENTITY_POLICY' --policy-document file://policy.json --access='{"actions":["s3:PutBucketPolicy"]}' { "result": "FAIL", "message": "The policy document grants access to perform one or more of the listed actions.", "reasons": [ { "description": "One or more of the listed actions in the statement with sid: PutBucketPolicyPermissions.", "statementIndex": 2, "statementId": "PutBucketPolicyPermissions" } ] } ...
CI/CD のプロセスの中で IAM Access Analyazer を活用したポリシーチェック/検証を行う例を学べました。
終わりに
SEC203-R | Refining IAM permissions like an expert [REPEAT] のセッションレポートでした。
このセッション(ワークショップ)は複数回開催されており、わたしは 2日目以降の実施回に参加しました。事前予約を行なっておらず、当日枠で早めに会場前に並んでいたのですが、長蛇の列が形成されていました。
隣に並んでいた外国の方と、「すごい人気だね」「IAM はやはり重要なサービスだからね」「わたしのモストフェイバリットなサービスは AWS IAM だよ」という趣旨の簡単な会話をしたのが印象的です。
会場はかなり広めでしたが、その多くの席が埋まっていました。現地で受講できてよかったなと思います。
2023年の終わりに追加された IAM Access Analyzer の機能をきちんと把握するにも実りのあるワークショップだったと思います。
皆さんも興味があれば試してみてください。
以上、 チバユキ (@batchicchi) がお送りしました。